from django.http import JsonResponse
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView

from .models import BookInfo
from .serializer import BookSerializer


# Create your views here.


class BooksView(GenericAPIView):
    """获取所有图书、保存图书"""

    queryset = BookInfo.objects.all()  # 指定当前类视图使用的查询集数据
    serializer_class = BookSerializer  # 指定当前类视图使用的序列化器

    def get(self, req):
        """获取所有图书"""
        # 查询所有的图书信息
        # print(req.query_params)
        # books = BookInfo.objects.all()
        
        books = self.get_queryset()  # 获取查询集中的所有数据
        ser = self.get_serializer(books, many=True)  # 使用指定序列化器，获取序列化器对象

        return Response(ser.data)  # data 是Serializer里提供的方法

    def post(self, req):
        """保存图书"""
        # 获取前端数据
        # json_dict = json.loads(req.body.decode())
        data = req.data
        # 2、校验数据
        # ser = BookSerializer(data=data)
        ser = self.get_serializer(data=data)
        ser.is_valid()
        # print(ser.validated_data)  # 获取验证后的字段

        # 保存数据
        ser.save()

        # 4、返回结果
        # return JsonResponse(ser.errors)
        return Response(ser.data)


class BookView(GenericAPIView):
    """获取单一图书、更新图书、删除图书"""

    queryset = BookInfo.objects.all()
    serializer_class = BookSerializer

    def get(self, req, pk):  # 这个形参必须叫pk
        """获取单一图书"""
        book = self.get_object()

        ser = self.get_serializer(book)  # 只验证一个，不需要写many

        return Response(ser.data)  # 不是返回列表，不用写safe

    def put(self, req, pk):
        """更新图书"""
        # 接收数据
        # json_dict = json.loads(req.body.decode())
        data = req.data
        # 校验数据
        try:
            book = self.get_object()  # 从查询集中获取指定的单数据对象
        except:
            return JsonResponse({'error': '信息错误'}, status=400)
        ser = self.get_serializer(book, data=data)
        ser.is_valid()  # 验证要记得

        # 3、更新数据
        ser.save()

        # 4、返回结果
        return Response(ser.data)

    def delete(self, req, pk):
        """删除图书"""
        # 获取要删除的图书对象
        try:
            book = self.get_object()
        except:
            return JsonResponse({'error': '信息错误'}, status=400)

        book.is_is_delete = True
        book.save()
        return Response({})  # 删除成功，返回空即可

